#include "_public.h"
using namespace idc;

// 程序退出和信号2、15的处理函数
void EXIT(int sig);

cpactive pactive;

int main(int argc,char *argv[])
{
    // 程序的帮助
    if(argc!=4){
        printf("\n");
        printf("Using:/project/tools/bin/deletefiles pathname matchstr timeout\n\n");

        printf("Example:/project/tools/bin/deletefiles /tmp/idc/surfdata \"*.xml,*json,*csv\" 0.01\n");
        cout<<R"(   /project/tools/bin/deletefiles /log/idc "*.log.20*" 0.02)"<<endl;
        printf("    /project/tools/bin/procctl 300 /projject/tools/bin/deletefiles /log/idc \"*.log.20*\" 0.02");
        printf("    /project/tools/bin/procctl 300 /project/tools/bin/deletefiles /tmp/idc/surfdata \"*.xml,*.json,*.csv\" 0.01\n\n");

        printf("这是一个工具程序，用于删除历史的数据文件或日志文件。\n");
        printf("本程序把pathname目录及子目录中timeout天之前的匹配matchstr文件全部删除，timeout可以是小数。\n");
        printf("本程序不写日志文件，也不会在控制台打印任何信息。\n\n\n");
        
        return -1;
    }

    // 忽略全部的信号和关闭I/O，设置信号处理函数。
    //closeioandsignal(true);     // 在开发测试阶段，这行代码不启用，方便显示调试信息。
    signal(2,EXIT);
    signal(15,EXIT);

    pactive.addpinfo(atoi(argv[1]),"deletefiles");  // 添加进程的心跳进入共享内存。

    // 获取被定义为历史数据文件的事件点。
    string strtimeout = ltime1("yyyymmddhh24miss",0-(int)(atof(argv[3])*24*60*60));
    cout<<"strtimeout="<<strtimeout<<endl;

    // 打开目录。
    cdir dir;
    if(dir.opendir(argv[1],argv[2],10000,true)==false){
        printf("opendir(%s) failed.\n",argv[1]);
        return -1;
    }
    
    // 遍历目录中的文件，如果是历史数据文件，删除它。
    while(dir.readdir()==true){
        // 把文件的时间与历史文件的时间点比较，如果更早，就需要删除。
        if(dir.m_mtime<strtimeout){
            // 删除文件，注意：文件全路径是m_ffilename，文件名是m_filename。
            if(remove(dir.m_ffilename.c_str())==0){
                printf("remove：%s ok.\n",dir.m_filename.c_str());
            }
            else{
                printf("remove：%s failed.\n",dir.m_filename.c_str());
           }
        }
    }

    return 0;
}

void EXIT(int sig)
{
    printf("程序退出，sig=%d\n\n",sig);

    exit(0);
}